package serveur;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.ArrayList;

public class Joueur {

	private ArrayList<Navire> navires;
	private String nom;
	private int numPartie;
	private Socket socket;		
	private BufferedReader in;
	private DataOutputStream out;
	private String message;
	private String reponse;
	private int nbPasDrone;
	private Thread placerNavires;


	Joueur( Socket socket,
			BufferedReader in, 
			DataOutputStream out,
			String nom, int numPartie) throws IOException{
		this.socket = socket;
		navires = new ArrayList<Navire>();
		navires.add(
				new Navire(-1, -1, -1, -1, 
						EnumNavire.SOUSMARIN1.getLongueur()));
		navires.add(
				new Navire(-1, -1, -1, -1, 
						EnumNavire.SOUSMARIN2.getLongueur()));
		navires.add(
				new Navire(-1, -1, -1, -1, 
						EnumNavire.TORPILLEUR1.getLongueur()));
		navires.add(
				new Navire(-1, -1, -1, -1, 
						EnumNavire.TORPILLEUR2.getLongueur()));
		navires.add(
				new Navire(-1, -1, -1, -1, 
						EnumNavire.DESTROYER1.getLongueur()));
		navires.add(
				new Navire(-1, -1, -1, -1, 
						EnumNavire.DESTROYER2.getLongueur()));
		navires.add(
				new Navire(-1, -1, -1, -1, 
						EnumNavire.CROISEUR.getLongueur()));
		this.nom = nom;
		this.numPartie = numPartie;
		message = null;
		this.in = in;
		this.out = out;
		nbPasDrone = 1;
		reponse=null;
		placerNavires = new Thread(new PlacerNavires(this));
	}



	boolean estTouche(int x, int y){
		boolean estTouche = false;
		int xA,xB,yA,yB;
		for(Navire n : navires){
			xA = n.getxA();
			xB = n.getxB();
			yA = n.getyA();
			yB = n.getyB();

			//si (x,y) appartient au segment [(xa,yA),(xB,yB)]
			if( ((xA <= x) && (xB > x) && (yA <= y) && (yB > y)) ||
					((xA > x) && (xB <= x) && (yA > y) && (yB <= y))   ) {
				n.setEstTouche(x, y);
				estTouche = true;
			}
		}
		return estTouche;
	}

	public void sendMessage(String msg, boolean attendRetour) 
			throws IOException{

		out.write(msg.getBytes());
		if(attendRetour){
			reponse = in.readLine();
		}
	}


	synchronized public boolean caseOccupee(int x1, int y1){
		int xA, yA, xB, yB;
		for(Navire n : navires){
			xA = n.getxA();
			yA = n.getyA();
			xB = n.getxB();
			yB = n.getyB();
			if(		((xB-xA)*(y1-yA)== (x1-xA)*(yB-yA) && (x1<=xB && x1>=xA)) ||
					((xA-xB)*(y1-yB) == (x1-xB)*(yA-yB) && (x1<=xA && x1>=xB))
					){
				return true;
			}
		}
		return false;
	}

	synchronized public boolean caseOccupee(int x1, int y1, int x2, int y2){
		int xA, yA, xB, yB;
		for(Navire n : navires){
			xA = n.getxA();
			yA = n.getyA();
			xB = n.getxB();
			yB = n.getyB();

			if(		((xB-xA)*(y1-yA)==(x1-xA)*(yB-yA) && (x1<=xB && x1>=xA)) ||
					((xA-xB)*(y1-yB)==(x1-xB)*(yA-yB) && (x1<=xA && x1>=xB)) ||
					((xB-xA)*(y2-yA)==(x2-xA)*(yB-yA) && (x2<=xB && x2>=xA)) ||
					((xA-xB)*(y2-yB)==(x2-xB)*(yA-yB) && (x2<=xA && x2>=xB)) )
			{
				return true;
			}

		}
		return false;
	}

	ArrayList<Navire> getNavires(){
		return navires;
	}

	void supprNavire(int navire){
		this.navires.remove(navire);
	}

	boolean estPerdant(){
		return navires.isEmpty();
	}

	String getNom(){
		return nom;
	}

	public int getNumPartie() {
		return numPartie;
	}

	public void setNumPartie(int numPartie) {
		this.numPartie = numPartie;
	}

	public void setNavires(ArrayList<Navire> navires) {
		this.navires = navires;
	}

	public void setNom(String nom) {
		this.nom = nom;
	}


	public Socket getSocket() {
		return socket;
	}

	public void setSocket(Socket socket) {
		this.socket = socket;
	}

	public BufferedReader getIn() {
		return in;
	}

	public void setIn(BufferedReader in) {
		this.in = in;
	}

	public DataOutputStream getOut() {
		return out;
	}

	public void setOut(DataOutputStream out) {
		this.out = out;
	}

	public int getNbPasDrone() {
		return nbPasDrone;
	}

	public void setNbPasDrone(int nbPasDrone) {
		this.nbPasDrone = nbPasDrone;
	}



	/**
	 * @return the placerNavires
	 */
	 public Thread getPlacerNavires() {
		 return placerNavires;
	 }



}